package cn.ac.siom.query.util;

public class IPdetermine {

    public String getBinaryNumber(String address){
        String[] networkAddressArray = address.split("\\.");
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < networkAddressArray.length; i++) {
            String str = networkAddressArray[i];
            if(Integer.toBinaryString(Integer.parseInt(str)).length()<8){
                int num = 8-Integer.toBinaryString(Integer.parseInt(str)).length();
                String ipStr1 = "";
                for (int j = 0; j < num; j++) {
                    ipStr1 += "0";
                }
                sb.append(ipStr1+(String)Integer.toBinaryString(Integer.parseInt(str)));
            }else{
                sb.append((String)Integer.toBinaryString(Integer.parseInt(str)));
            }
        }
        return sb.toString();
    }
    public String getDecimalismByBinary(String address){
        String str = "";
        for (int i = 1; i <= 4; i++) {
            str += Integer.parseInt(address.substring((i-1)*8,i*8),2)+".";
        }
        return str.substring(0,str.length()-1);
    }

    public static boolean ipIsValid(String ipSection, String ip) {
        if (ipSection == null)
            throw new NullPointerException("IP段不能为空！");
        if (ip == null)
            throw new NullPointerException("IP不能为空！");
        ipSection = ipSection.trim();
        ip = ip.trim();
        final String REGX_IP = "((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
        final String REGX_IPB = REGX_IP + "\\-" + REGX_IP;
        if (!ipSection.matches(REGX_IPB) || !ip.matches(REGX_IP))
            return false;
        int idx = ipSection.indexOf('-');
        String[] sips = ipSection.substring(0, idx).split("\\.");
        String[] sipe = ipSection.substring(idx + 1).split("\\.");
        String[] sipt = ip.split("\\.");
        long ips = 0L, ipe = 0L, ipt = 0L;
        for (int i = 0; i < 4; ++i) {
            ips = ips << 8 | Integer.parseInt(sips[i]);
            ipe = ipe << 8 | Integer.parseInt(sipe[i]);
            ipt = ipt << 8 | Integer.parseInt(sipt[i]);
        }
        if (ips > ipe) {
            long t = ips;
            ips = ipe;
            ipe = t;
        }
        return ips <= ipt && ipt <= ipe;
    }

}
